﻿using System;

namespace 类和类成员
{
    class Program
    {
        static void Main(string[] args)
        {
            NewClass @new = new NewClass();//非静态类需要实例化
            @new.name = "黄炎榕";
            Console.WriteLine("这里是非静态类，需要实例化，通过对象名点出来，名字为{0}",@new.name);

            Sta.age = 21;//静态类直接通过类名点出来
            Console.WriteLine("这里是静态类，可以直接通过类名点出来，年龄为{0}岁",Sta.age);
            Console.ReadKey();
        }
    }

    //类的访问修饰符之public：任何地方调用，完全公开的
    public class First
    {

    }

    //类的访问修饰符之internal:访问仅限于当前项目
    internal class Second
    {

    }

    //类的修饰符之抽象类:抽象类不能被实例化，只能被继承
    abstract class BaseClass
    {
        public abstract string OutPut();//取钱
        public abstract string InPut();//存钱
        public abstract string ZZ();//转账
    }

    /// <summary>
    /// 派生类继承基类，方法重写，例如可用于银行管理系统
    /// </summary>
    class NewClass : BaseClass//新人开户拥有的基础功能
    {
        public override string InPut()
        {
            throw new NotImplementedException();
        }

        public override string OutPut()
        {
            throw new NotImplementedException();
        }

        public override string ZZ()
        {
            throw new NotImplementedException();
        }
        public string name;
    }

    class VipClass : NewClass//VIP用户特权功能（同时普通用户拥有的基础功能可直接继承）
    {

    }

    //类的修饰符之密封类:密封类只能实例化，不能被继承
    sealed class Sea
    {

    }

    /*
     * 类的修饰符之静态类:静态类不能被实例化，类中的成员都是静态的，可以通过类名点出里面的成员
     * 非静态类使用时需要实例化，通过对象名点出来
    */
    static class Sta
    {
        public static int age;
    }

    //类成员的访问修饰符
    class @Class
    {
        public string name;//公开的，谁都OK
        private int age;//私有的，同类中可以访问
        internal string sex;//同项目中可访问
        protected string hobby;//同类或者派生类可以访问
    }

    //类成员修饰符
    class MyClass
    {
        readonly int age = 21;//只读
        static string name = "HYR";
    }

    class Student
    {
        private int age;//字段
        public string name { get; set; }//属性 get只读，set只写
    }
}
